<?php
/**
 * Created by 无所谓已
 * User: Administrator
 * Date: 2025-08-16
 * Time: 21:57
 */

namespace plugin\csauto\app\service;

/**
 * Class HelperService
 * 辅助工具函数服务
 * @package plugin\csauto\app\service
 */
class HelperService
{
    /**
     * 将文件大小转换为GB
     * @param mixed $size 文件大小（支持各种格式）
     * @return float
     */
    public static function convertToGB($size)
    {
        // 处理空值和null
        if ($size === null || $size === '' || $size === false) {
            return 0.0;
        }

        // 转换为字符串进行处理
        $sizeStr = trim((string)$size);

        // 如果是纯数字，当作字节处理
        if (is_numeric($sizeStr)) {
            $sizeNum = floatval($sizeStr);
            // 如果数字太大，可能是字节；如果适中，可能是MB；如果很小，可能是KB
            if ($sizeNum >= 1024 * 1024 * 1024) {
                // 大于1GB，当作字节
                return $sizeNum / (1024 * 1024 * 1024);
            } elseif ($sizeNum >= 1024 * 1024) {
                // 大于1MB，当作MB
                return $sizeNum / (1024 * 1024);
            } elseif ($sizeNum >= 1024) {
                // 大于1KB，当作KB
                return $sizeNum / (1024 * 1024 * 1024);
            } else {
                // 小于1KB，当作字节
                return $sizeNum / (1024 * 1024 * 1024);
            }
        }

        // 提取数字部分和单位
        $number = preg_replace('/[^\d.]/', '', $sizeStr);
        $unit = preg_replace('/[\d.\s]/', '', strtolower($sizeStr));

        if (empty($number) || !is_numeric($number)) {
            return 0.0;
        }

        $number = floatval($number);

        // 根据单位转换为GB
        switch ($unit) {
            case 'tb':
            case 't':
                return $number * 1024;  // 1 TB = 1024 GB
            case 'gb':
            case 'g':
                return $number;
            case 'mb':
            case 'm':
                return $number / 1024;  // 1 GB = 1024 MB
            case 'kb':
            case 'k':
                return $number / (1024 * 1024);  // 1 GB = 1024 * 1024 KB
            case 'b':
            case 'byte':
            case 'bytes':
                return $number / (1024 * 1024 * 1024);  // 1 GB = 1024^3 bytes
            default:
                // 如果没有明确单位，尝试智能判断
                if (preg_match('/(\d+(?:\.\d+)?)\s*([a-zA-Z]*)/', $sizeStr, $matches)) {
                    $num = floatval($matches[1]);
                    $unit = trim($matches[2]);

                    // 如果单位是中文
                    if (in_array($unit, ['字节', 'b'])) {
                        return $num / (1024 * 1024 * 1024);
                    } elseif (in_array($unit, ['kb', '千字节'])) {
                        return $num / (1024 * 1024);
                    } elseif (in_array($unit, ['mb', '兆', '兆字节'])) {
                        return $num / 1024;
                    } elseif (in_array($unit, ['gb', '吉', '吉字节'])) {
                        return $num;
                    } elseif (in_array($unit, ['tb', '太', '太字节'])) {
                        return $num * 1024;
                    }
                }

                // 默认当作字节处理（最保守的方式）
                return floatval($sizeStr) / (1024 * 1024 * 1024);
        }
    }

    /**
     * 获取种子文件哈希值
     * @param string $torrentPath
     * @return string|null
     */
    public static function getTorrentHash($torrentPath)
    {
        if (!file_exists($torrentPath)) {
            return null;
        }

        $content = file_get_contents($torrentPath);
        if (!$content) {
            return null;
        }

        // 检查是否为有效的torrent文件
        if (substr($content, 0, 1) !== 'd') {
            return null;
        }

        // 简单的Bencode解析来获取info部分
        $infoStart = strpos($content, '4:info');
        if ($infoStart === false) {
            return null;
        }

        $infoStart += 6; // 跳过"4:info"
        $infoContent = substr($content, $infoStart);

        // 找到info部分的结束（下一个字典或列表的开始）
        $bracketCount = 0;
        $inString = false;
        $escapeNext = false;
        $infoEnd = $infoStart;

        for ($i = 0; $i < strlen($infoContent); $i++) {
            $char = $infoContent[$i];

            if ($escapeNext) {
                $escapeNext = false;
                continue;
            }

            if ($char === '\\') {
                $escapeNext = true;
                continue;
            }

            if ($inString) {
                if ($char === '"') {
                    $inString = false;
                }
                continue;
            }

            if ($char === '"') {
                $inString = true;
                continue;
            }

            if ($char === 'd' || $char === 'l') {
                if ($bracketCount === 0) {
                    $infoEnd = $infoStart + $i;
                    break;
                }
                $bracketCount++;
            } elseif ($char === 'e') {
                $bracketCount--;
            }
        }

        $infoData = substr($content, $infoStart, $infoEnd - $infoStart);

        return sha1($infoData);
    }
}
